package com.cmc.cloud.cmclink.doc.service.impl.si;

import com.cmc.cloud.cmclink.doc.constants.errorconstant.BlnoMultipleSoErrorCodeConstants;
import com.cmc.cloud.cmclink.doc.entity.SoDO;
import com.cmc.cloud.cmclink.doc.service.si.BlnoMultipleSoService;
import com.cmc.cloud.cmclink.doc.vo.blnomultiplesovo.BlnoMultipleSoCreateReqVO;
import com.cmc.cloud.cmclink.doc.vo.blnomultiplesovo.BlnoMultipleSoPageReqVO;
import com.cmc.cloud.cmclink.doc.vo.blnomultiplesovo.BlnoMultipleSoUpdateReqVO;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;

import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import com.cmes.framework.common.pojo.PageResult;
import com.cmes.framework.common.exception.util.ServiceExceptionUtil;

import java.util.*;
import com.cmc.cloud.cmclink.doc.entity.BlnoMultipleSoDO;
import com.cmc.cloud.cmclink.doc.convert.BlnoMultipleSoConvert;
import com.cmc.cloud.cmclink.doc.mapper.BlnoMultipleSoMapper;


/**
 * 多so 合并si 关系 Service 实现类
 *
 * @author 集运管理员
 */
@Service
@Validated
public class BlnoMultipleSoServiceImpl implements BlnoMultipleSoService {

    @Resource
    private BlnoMultipleSoMapper blnoMultipleSoMapper;

    @Override
    public void createBlnoMultipleSo(BlnoMultipleSoCreateReqVO createReqVO) {
        // 插入
        BlnoMultipleSoDO blnoMultipleSo = BlnoMultipleSoConvert.INSTANCE.convert(createReqVO);
        blnoMultipleSoMapper.insert(blnoMultipleSo);
    }

    @Override
    public void updateBlnoMultipleSo(BlnoMultipleSoUpdateReqVO updateReqVO) {
        // 校验存在
        validateBlnoMultipleSoExists(updateReqVO.getId());
        // 更新
        BlnoMultipleSoDO updateObj = BlnoMultipleSoConvert.INSTANCE.convert(updateReqVO);
        blnoMultipleSoMapper.updateById(updateObj);
    }

    @Override
    public void deleteBlnoMultipleSo(Long id) {
        // 校验存在
        validateBlnoMultipleSoExists(id);
        // 删除
        blnoMultipleSoMapper.deleteById(id);
    }

    private void validateBlnoMultipleSoExists(Long id) {
        if (blnoMultipleSoMapper.selectById(id) == null) {
            throw ServiceExceptionUtil.exception(BlnoMultipleSoErrorCodeConstants.BLNO_MULTIPLE_SO_NOT_EXISTS);
        }
    }

    @Override
    public BlnoMultipleSoDO getBlnoMultipleSo(Long id) {
        return blnoMultipleSoMapper.selectById(id);
    }

    @Override
    public List<BlnoMultipleSoDO> getBlnoMultipleSoList(Collection<Long> ids) {
        return blnoMultipleSoMapper.selectBatchIds(ids);
    }

    @Override
    public PageResult<BlnoMultipleSoDO> getBlnoMultipleSoPage(BlnoMultipleSoPageReqVO reqVO) {
        IPage<BlnoMultipleSoDO> page = Page.of(reqVO.getPageNo(), reqVO.getPageSize());
        
        IPage<BlnoMultipleSoDO> result = blnoMultipleSoMapper.selectPageList(page, reqVO);
        return new PageResult<BlnoMultipleSoDO>(result.getRecords(), result.getTotal());
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void createSoSiRelation(Long blnoId, List<SoDO> soDOList, Long mainSoId) {
        List<BlnoMultipleSoDO> blnoMultipleSoDos = new ArrayList<>();
        soDOList.forEach(
                n -> {
                    BlnoMultipleSoDO blnoMultipleSoDO = new BlnoMultipleSoDO();
                    blnoMultipleSoDO.setBlnoId(blnoId);
                    blnoMultipleSoDO.setBookingNo(n.getBookingNo());
                    blnoMultipleSoDO.setSoId(n.getId());
                    blnoMultipleSoDO.setSoBlNo(n.getBlNo());
                    blnoMultipleSoDO.setMainSoFlag(mainSoId.compareTo(n.getId()) == 0);
                    blnoMultipleSoDos.add(blnoMultipleSoDO);
                }
        );
        blnoMultipleSoMapper.insertBatch(blnoMultipleSoDos);
    }
}
